2.1k 词
模块化无模块化标准阶段早在模块化标准还没有诞生的时候,前端领域已经产生了一些模块化的开发手段,如文件划分、命名空间和 IIFE 私有作用域。 (1)文件划分: 文件划分方式是最原始的模块化实现,简单来说就是将应用的状态和逻辑分散到不同的文件中,然后通过 HTML 中的 script 来一一引入。 问题: 模块的变量相当于全局声明和定义,会出现命名冲突的问题 由于变量都在全局定义,我们很难知道某个变量到底属于哪个模块,造成了调试困难 无法清晰的管理模块之间的依赖关系和加载顺序,加载顺序只能通过手动调整script标签的位置实现。 (2)命名空间: 命名空间是模块化的另一种实现手段,它可以解决上述文件划分方式中全局变量定义所带来的一系列问题。通过将每个模块的生命周期指定一个所属的命名空间,达到解决变量污染的问题,具体的实现是在每个模块包裹上windown.命名空间 (3)IIFE(立即执行函数): 相比于命名空间的模块化手段,IIFE实现的模块化安全性要更高,对于模块作用域的区分更加彻底。 我们知道,每个IIFE 即立即执行函数都会创建一个私有的作用域,在私有作用域中...
264 词
组件封装的原则 统一性 API和组件名的定义要符合规范,比如常用的onClick,补药定义成onPress,尺寸的small / middle / large 补药定义成sm / md /lg 单一职责 如何控制组件的颗粒度是一个难题,也是最考验技术的一点 考虑是否有多个组件复用,如果有可以在后续重构 逻辑功能复杂的组件,哪怕只有一个地方用到,也可以单独封装起来 根据页面结构,或者组件结构拆分 复用性 组件复用性设计其实从某种意义上来说是要放弃对组件的控制权,让使用者能够最大限度的进行 DIY 还需要考虑的: 生命周期 通信
1.4k 词
《Vue的设计与实现》——霍春阳响应系统作用与实现1234567891011121314151617181920212223const targetMap = new WeakMap();const obj = new Proxy(data, { // 监听读取操作 get(target, key) { track(target, key); return targer[key]; }; set(target, key, newVal) { target[key] = newVal; triger(targer, key); }})function track(target, key) {}function triger(target, key) {} a. 分支切换导致的副作用冗余问题 cleanup函数 b. 遍历set时导致的无限循环问题 创建一个新的Set数据结构 c. 嵌套副作用函数导致响应式关...
614 词
硬件结构图灵机 纸带 -> 内存 读写头 控制单元 存储单元 运算单元 冯诺依曼模型 运算器 存储器 控制器 输入设备 输出设备 内存中央处理器CPU 内部还有一些组件,常见的有寄存器、控制单元和逻辑运算单元 常用的寄存器种类有: 1. 通用寄存器 1. 指令寄存器 1. 程序计数器 通用寄存器,用来存放需要进行运算的数据; 指令寄存器用来存放当前正在执行以及执行完的指令; 程序计数器用来存放下一条需要执行的指令的地址; 事件总线总线是用于 CPU 和内存以及其他设备之间的通信,总线可分为 3 种: 地址总线 数据总线 控制总线 地址总线,用于指定 CPU 将要操作的内存地址; 数据总线,用于读写内存的数据; 控制总线,用于发送和接收信号,比如中断、设备复位等信号 中断在计算机中,中断是系统用来响应硬件设备请求的一种机制,操作系统收到硬件的中断请求,会打断正在执行的进程,然后调用内核中的中断处理程序来响应请求。 操作系统收到了中断请求,会打断其他进程的运行,所以 中断请求的响应程序 也就是中断处理程序,要尽可能快的执行完,这样可以减少对正常进程运行调度地影响...
9.3k 词
Axios二次封装Axios是什么?定义 Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 特性 从浏览器创建 XMLHttpRequests 从 node.js 创建 http 请求 支持 Promise API 拦截请求和响应 转换请求和响应数据 取消请求 超时处理 查询参数序列化支持嵌套项处理 自动将请求体序列化为: JSON (application/json) Multipart / FormData (multipart/form-data) URL encoded form (application/x-www-form-urlencoded) 将 HTML Form 转换成 JSON 进行请求 自动转换JSON数据 获取浏览器和 node.js 的请求进度,并提供额外的信息(速度、剩余时间) 为 node.js ...
228 词
前端学习路线前端基本功HTMLCSSJavascript前后端联调对接ajax、fetchAPI工程化提效框架包管理工具构建工具git部署上线服务器nginxdocker浏览器相关知识浏览器进程浏览器调试工具事件循环浏览器渲染步骤跨端技术多端开发 uniapp taro flutter 小程序原生移动端 react native 计算机基础知识 数据结构 计算机网路 操作系统 计算机组成原理 其它技术SSR 服务端渲染3D埋点监控单元测试性能优化业务技术 单点登录 无感刷新 跨域问题
913 词
国际化方案国际化背景​ 国际化(Internationalization,简称 i18n)是指在软件、网站或应用开发中,使其能够适应不同国家或地区的语言、文化、时间格式、货币符号、法律规范等多样化需求的过程。通过国际化,产品可以更容易地进行本地化(Localization),即根据特定地区的需求进行适应和调整,而无需重新开发整个系统。 国际化的核心目标是设计和构建一个产品,使其能够支持多语言、多地区的使用,并且能够灵活处理各种与地域相关的差异,如文本翻译、日期格式、货币、单位、输入法等。 扩展: 本地化:本地化(Localization, L10n)的核心是将产品适配特定地区的语言、文化、习俗和法律要求,以便为目标市场提供符合当地用户期望的体验。 国际化需要解决的问题 语言翻译 静态文案(前端静态模板文案) 动态文案(服务端下发的动态数据) 样式 不同的语言文案,长度不一样,容易造成样式混乱 图片替换(带有文案的图片) 受文化习惯的影响,部分地区使用从右到左的阅读方式 文化习惯 货币单位 时间格式 准确的文字翻译,受文化风俗的影响,相同的文字可能蕴...
1.2k 词
构建DOM树什么是Dom 从页面的视角来看,DOM 是生成页面的基础数据结构。 从 JavaScript 脚本视角来看,DOM 提供给 JavaScript 脚本操作的接口,通过这套接口,JavaScript 可以对 DOM 结构进行访问,从而改变文档的结构、样式和内容。 从安全视角来看,DOM 是一道安全防护线,一些不安全的内容在 DOM 解析阶段就被拒之门外了 渲染引擎还有一个安全检查模块叫 XSSAuditor,是用来检测词法安全的。在分词器解析出来 Token 之后,它会检测这些模块是否安全,比如是否引用了外部脚本,是否符合 CSP 规范,是否存在跨站点请求等。如果出现不符合规范的内容,XSSAuditor 会对该脚本或者下载任务进行拦截。详细内容我们会在后面的安全模块介绍,这里就不赘述了 Dom树如何生成在渲染引擎内部,有一个叫HTML 解析器(HTMLParser)的模块,它的职责就是负责将 HTML 字节流转换为 DOM 结构。 详细流程 浏览器判断响应头中的 content-type 字段 创建渲染进程,网络进程和渲染进程之间会建立一个共享数据的管道 渲染进...
1.6k 词
浏览器缓存——强缓存和协商缓存为了减轻服务器的压力,http提供了一个叫做缓存的解决方案。当数据没有发生变化时,浏览器每次都从缓存中读取数据,但是这样有个问题就是浏览器怎么知道服务器何时更新了资源。于是我们把缓存添加了一个有效时间,只要缓存过期,浏览器就会重新向服务端发起请求,这个缓存有效的时间主要由服务端设置。 强缓存(本地缓存)概念不需要跟服务器进行通信,直接使用本地缓存的资源 相关的header字段 **expires**: 缓存过期时间, 一个未来时间,代表资源何时无效 缺点: 这种方法有个弊端就是当服务器时间和浏览器端的时间不同步时,就会导致一些错误,于是出现了下面的改进方法: **cache-control(http1.1)**: 这种方法采用相对时间的方式,有效时间从浏览器端收到响应结果开始生效 max-age:代表在这个请求正确返回的时间的一段时间内再次加载资源,就会命中强缓存。 no-cache:不使用本地缓存,向浏览器发送新鲜度校验请求 no-store:禁止缓存浏览器数据,也禁止保存至临时文件中,每次都重新请求 public:任何情况下都缓存(即使是...
606 词
HTTPSHTTPS 在HTTP的基础上多了一层TLS协议的建立 TLS四次握手(非对称加密过程)客户端发给服务端 客户端随机数 支持的协议,如TLS1.2 支持的加密算法,如RSA 服务端发给客户端 服务端随机数 接下来加密用的协议和加密算法 CA证书 客户端发给服务端 取出CA证书中的服务器公钥 生成pre_master_key, 用公钥加密然后发给服务器 将三个随机数:客户端随机数、服务端随机数、pre_master_key 计算得出一个会话密钥 将迄今为止的通信数据生成一个摘要,也叫finish报文,用会话密钥加密后传给服务端做校验 服务端发给客户端 服务端使用服务端私钥解密,得到pre_master_key, 集齐三个随机数 将三个随机数:客户端随机数、服务端随机数、pre_master_key 计算得出一个会话密钥 将迄今为止的通信数据生成一个摘要,也叫finish报文,用会话密钥加密后传给客户端做校验 后续就一直使用会话密钥进行对称加密了 问题: 为什么不直接传公钥,而是使用CA证书加密后的公钥 为什么是三个随机数,而不是一个或者两个 http发...